热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于STM32的智能太阳能路灯设计与华为云IOT集成方案

篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于STM32设计的智慧路灯(太阳能+华为云IOT)相关的知识,希望对你有一定的参考价值。 1. 前言 随着工业和城市的快速发展,道路照

篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于STM32设计的智慧路灯(太阳能+华为云IOT)相关的知识,希望对你有一定的参考价值。



1. 前言

随着工业和城市的快速发展,道路照明系统的产业也在迅速发展,并趋于复杂化,为了更经济地控制和维护复杂的路灯系统,市面上各大科技公司开发了各种路灯控制系统,并且路灯都连上物联网云端,连上了政府网络,可以远程了解路灯的工作情况,运行情况。
为了方便了解物联网平台,学习物联网开发,了解智慧路灯的开发,本文就采用华为云IOT物联网平台,选择STM32作为主控芯片,再配合相关的传感器完成智慧路灯开发。


2. 具体实现的功能以及相关的硬件

当前设计的智慧路灯采用NBIOT模块-BC20连接华为云物联网服务器,上传路灯的各种参数信息:环境光强度、太阳能充电板电压、锂电池电量等信息。设计了一款手机APP,可以通过华为云物联网平台的应用侧提供的开发接口,获取路灯上传的参数信息,并且可以在手机APP上远程手动控制路灯开关,设置路灯的开启和关闭时间等。 智慧路灯的的主控芯片采用STM32F103C8T6、NBIOT联网模块采用BC20,BC20内置了MQTT协议,可以通过AT指令连接物联网平台实现通信。智慧路灯采用锂电池供电,并且配有太阳能充电板,可以使用太阳进行充电补偿电量。使用了功率监控器,电池电量检测芯片,可以检测充电效率、电流、电压、电池电量等信息。BC20带了GPS功能,可以上报路灯的GPS位置到云端服务器,手机APP获取之后,可以调用百度地图显示出路灯的位置。




3. 硬件选型


3.1 STM32F103C8T6



3.2 太阳能板


3.3 锂电池充电模块


3.4 功率检测模块


3.5 BH1750光敏传感器


3.6 LED灯


3.7 BC20-NBIOT模块

型号: BC20+BD+GPS
品牌: 创思
产地: 中国大陆
接口类型: TTL
适用场景: NBIOT
尺寸: 40x40x12mm
工作电流: 0.5A
支持TCP/IP协议:
支持传输速率: 115200Kbps
工作电压: 5V
是否支持语音电话:
模块类型: 其他
是否支持短信:
支持制式标准: GSM/GPRS(2G)
是否支持电话簿:


4. 创建产品与设备


4.1 创建产品

地址:https://www.huaweicloud.com/?locale=zh-cn




4.2 自定义模型

地址: https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-dev/all-product/7211833377cf435c8c0580de390eedbe/product-detail/6276134223aaf461a0f6e515










4.3 创建设备



"device_id": "6276134223aaf461a0f6e515_1126626497",
"secret": "12345678"


4.4 MQTT密匙生成

创建完产品、设备之后,接下来就需要知道如何通过MQTT协议登陆华为云服务器。
官方的详细介绍在这里:
https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#ZH-CN_TOPIC_0240834853__zh-cn_topic_0251997880_li365284516112

属性上报格式:
https://support.huaweicloud.com/api-iothub/iot_06_v5_3010.html

MQTT设备登陆密匙生成地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

DeviceId 6276134223aaf461a0f6e515_1126626497
DeviceSecret 12345678
ClientId 6276134223aaf461a0f6e515_1126626497_0_0_2022050706
Username 6276134223aaf461a0f6e515_1126626497
Password 73ebe0779dbd5b2e2fd3db8ab8f642b78d7a532576f2e14d2799d4f78d37bcc8

华为云物联网平台的域名是: 161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
华为云物联网平台的IP地址是:121.36.42.100
在软件里参数填充正确之后,就看到设备已经连接成功了。
接下来打开设备页面,可以看到设备已经在线了。


4.5 主题订阅与发布

//订阅主题: 平台下发消息给设备
$oc/devices/6276134223aaf461a0f6e515_1126626497/sys/messages/down
//设备上报数据
$oc/devices/6276134223aaf461a0f6e515_1126626497/sys/properties/report
//上报的属性消息 (一次可以上报多个属性,在json里增加就行了)
"services": ["service_id": "led","properties":"GPS":"lat:12.345,lng:45.678"]

通过MQTT客户端软件模拟上报测试:


4.6 应用侧开发

为了更方便的展示设备数据,与设备完成交互,还需要开发一个配套的上位机,官方提供了应用侧开发的API接口、SDK接口,为了方便通用一点,我这里采用了API接口完成数据交互,上位机软件采用QT开发。

帮助文档地址: ttps://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html

设备属性就是设备上传的传感器状态数据信息,应用侧提供了API接口,可以主动向设备端下发请求指令;设备端收到指令之后需要按照约定的数据格式上报数据;所以,要实现应用层与设备端的数据交互,需要应用层与设备端配合才能完成。



5. STM32程序设计

STM32连接华为云IOT的工程案例: https://download.csdn.net/download/xiaolong1126626497/81993720


5.1 BC20连接华为云物联网服务器-调试

连接MQTT服务器
AT+QMTOPEN=0,"a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com",1883
OK
+QMTOPEN: 0,0
登录MQTT服务器
命令格式: AT&#43;QMTCONN&#61;<tcpconnectID>,<clientID>,<username>,<password>
AT&#43;QMTCONN&#61;0,"6210e8acde9933029be8facf_dev1_0_0_2022021913","6210e8acde9933029be8facf_dev1","6cea55404b463e666cd7a6060daba745bbaa17fe7078dfef45f8151cdf19673d"
OK
&#43;QMTCONN: 0,0,0
订阅主题
命令格式: AT&#43;QMTSUB&#61;<tcpconnectID>,<msgID>,"”,[,"<topic2>,<qos2>]
AT&#43;QMTSUB&#61;0,1,"$oc/devices/6210e8acde9933029be8facf_dev1/sys/messages/down",2
OK
&#43;QMTSUB: 0,1,0,2
发布主题
命令格式:AT&#43;QMTPUB&#61;<tcpconnectID>,<msgID>,<qos>,<retain>,"",""
先发送指令:
AT&#43;QMTPUB&#61;0,0,0,0,"$oc/devices/6210e8acde9933029be8facf_dev1/sys/properties/repor"
等待返回 ">"
接着发送数据.不需要加回车。
""services": ["service_id": "gps","properties":"longitude":12.345,"latitude":33.345]"
数据发送完毕&#xff0c;再发送结束符。 十六进制的值--0x1a 。某些串口调试助手可以适应ctrl&#43;z 快捷键输入0xA
等待模块返回"OK",到此数据发送完成。
OK
&#43;QMTPUB: 0,0,0

5.2 测试模块

第一步接上之后&#xff0c;串口调试助手选择波特率为115200&#xff0c;勾选软件上的发送新行选项。发送AT过去&#xff0c;正常模块会返回OK

查询模块是否正常
AT
OK
获取卡号,查询卡是否插好
AT&#43;CIMI
460041052911195
OK
激活网络
AT&#43;CGATT&#61;1
OK
获取网络激活状态
AT&#43;CGATT?
&#43;CGATT: 1
OK
查询网络质量
AT&#43;CSQ
&#43;CSQ: 26,0
OK

AT&#43;CEREG&#61;? //检查网络状态
&#43;CEREG: 0,1 //找网成功
OK

5.3 keil工程代码

MQTT协议连接华为云IOT源码工程: https://download.csdn.net/download/xiaolong1126626497/81993720




5.4 功率检测

#include "INA226.h"
#include "delay.h"
// 接线说明&#xff1a;
// 模拟IIC:
//IIC_SCL -- 时钟线PB6(推挽、开漏输出)
//IIC_SDA -- 双向数据线PB7
INA226 ina226_data;
//初始化INA226
void INA226_Init(void)

IIC_Init();
INA226_SendData(INA226_ADDR1,CFG_REG,0x8000); //重新启动

INA226_SendData(INA226_ADDR1,CFG_REG,0x484f); //设置转换时间204us,求平均值次数128&#xff0c;采样时间为204*128&#xff0c;设置模式为分流和总线连续模式
INA226_SendData(INA226_ADDR1,CAL_REG,CAL); //设置分辨率
//INA226_SendData(INA226_ADDR1,CAL_REG,0x0012);//设置分流电压转电流转换参数
INA226_Get_ID(INA226_ADDR1); //获取ina226的id

//设置寄存器指针
void INA226_SetRegPointer(u8 addr,u8 reg)

IIC_Start();
IIC_Send_Byte(addr);
IIC_Wait_Ack();
IIC_Send_Byte(reg);
IIC_Wait_Ack();
IIC_Stop();

//发送,写入数据
void INA226_SendData(u8 addr,u8 reg,u16 data)

u8 temp&#61;0;
IIC_Start();
IIC_Send_Byte(addr);
IIC_Wait_Ack();
IIC_Send_Byte(reg);
IIC_Wait_Ack();

temp &#61; (u8)(data>>8);
IIC_Send_Byte(temp);
IIC_Wait_Ack();
temp &#61; (u8)(data&0x00FF);
IIC_Send_Byte(temp);
IIC_Wait_Ack();

IIC_Stop();

//读取数据
u16 INA226_ReadData(u8 addr)

u16 temp&#61;0;
IIC_Start();
IIC_Send_Byte(addr&#43;1);
IIC_Wait_Ack();

temp &#61; IIC_Read_Byte(1);
temp<<&#61;8;
temp |&#61; IIC_Read_Byte(0);

IIC_Stop();
return temp;

//1mA/bit
u16 INA226_GetShunt_Current(u8 addr)

u16 temp&#61;0;
INA226_SetRegPointer(addr,CUR_REG);
temp &#61; INA226_ReadData(addr);
if(temp&0x8000) temp &#61; ~(temp - 1);
return temp;

//获取id
void INA226_Get_ID(u8 addr)

u32 temp&#61;0;
INA226_SetRegPointer(addr,INA226_GET_ADDR);
temp &#61; INA226_ReadData(addr);
ina226_data.ina226_id &#61; temp;

//获取校准值
u16 INA226_GET_CAL_REG(u8 addr)

u32 temp&#61;0;
INA226_SetRegPointer(addr,CAL_REG);
temp &#61; INA226_ReadData(addr);
return (u16)temp;

//1.25mV/bit
u16 INA226_GetVoltage(u8 addr)

u32 temp &#61; 0;
INA226_SetRegPointer(addr,BV_REG);
temp &#61; INA226_ReadData(addr);
return (u16)temp;

//2.5uV/bit
u16 INA226_GetShuntVoltage(u8 addr)

int16_t temp &#61; 0;
INA226_SetRegPointer(addr,SV_REG);
temp &#61; INA226_ReadData(addr);
if(temp&0x8000) temp &#61; ~(temp - 1);
return (u16)temp;

//获取电压
void GetVoltage(float *Voltage)//mV

*Voltage &#61; INA226_GetVoltage(INA226_ADDR1)*Voltage_LSB;

//获取分流电压
void Get_Shunt_voltage(float *Voltage)//uV

*Voltage &#61; (INA226_GetShuntVoltage(INA226_ADDR1)*INA226_VAL_LSB);//如需矫正电流分流参数请将这里改为2.5

//获取电流
void Get_Shunt_Current(float *Current)//mA

*Current &#61; (INA226_GetShunt_Current(INA226_ADDR1)* CURRENT_LSB);

//获取功率&#61; 总线电压 * 电流
void get_power()//W

GetVoltage(&ina226_data.voltageVal); //mV
Get_Shunt_voltage(&ina226_data.Shunt_voltage); //uV
Get_Shunt_Current(&ina226_data.Shunt_Current); //mA
Get_Power(&ina226_data.Power);
ina226_data.Power_Val &#61; ina226_data.voltageVal*0.001f * ina226_data.Shunt_Current*0.001f; //mV*mA

//获取功率装载值,ina226内部计算的的功率&#xff0c;由于未经校准&#xff0c;故不采用
u16 INA226_Get_Power(u8 addr)

int16_t temp&#61;0;
INA226_SetRegPointer(addr,PWR_REG);
temp &#61; INA226_ReadData(addr);
return (u16)temp;

//获取功率,ina226内部计算&#xff0c;不准确&#xff0c;不采用
void Get_Power(float *Power)//W

*Power &#61; (INA226_Get_Power(INA226_ADDR1)*POWER_LSB);

//不设置报警&#xff0c;舍弃
/*
u8 INA226_AlertAddr()
u8 temp;
IIC_Start();
IIC_Send_Byte(INA226_GETALADDR);
IIC_Wait_Ack();

temp &#61; IIC_Read_Byte(1);

IIC_Stop();
return temp;
*/


5.5 BH1750环境光强度

#include "bh1750.h"
float Read_BH1750_Data()

unsigned char t0;
unsigned char t1;
float t;
u8 r_s&#61;0;
IIC_Start(); //发送起始信号
IIC_WriteOneByteData(0x46);
r_s&#61;IIC_GetACK();//获取应答
if(r_s)printf("error:1\\r\\n");
IIC_WriteOneByteData(0x01);
r_s&#61;IIC_GetACK();//获取应答
if(r_s)printf("error:2\\r\\n");
IIC_Stop(); //停止信号

IIC_Start(); //发送起始信号
IIC_WriteOneByteData(0x46);
r_s&#61;IIC_GetACK();//获取应答
if(r_s)printf("error:3\\r\\n");
IIC_WriteOneByteData(0x01);
r_s&#61;IIC_GetACK();//获取应答
if(r_s)printf("error:4\\r\\n");
IIC_Stop(); //停止信号

IIC_Start(); //发送起始信号
IIC_WriteOneByteData(0x46);
r_s&#61;IIC_GetACK();//获取应答
if(r_s)printf("error:5\\r\\n");
IIC_WriteOneByteData(0x10);
r_s&#61;IIC_GetACK();//获取应答
if(r_s)printf("error:6\\r\\n");
IIC_Stop(); //停止信号

DelayMs(100); //等待

IIC_Start(); //发送起始信号
IIC_WriteOneByteData(0x47);
r_s&#61;IIC_GetACK();//获取应答
if(r_s)printf("error:7\\r\\n");

t0&#61;IIC_ReadOneByteData(); //接收数据
IIC_SendACK(0); //发送应答信号
t1&#61;IIC_ReadOneByteData(); //接收数据
IIC_SendACK(1); //发送非应答信号
IIC_Stop(); //停止信号

t&#61;(((t0<<8)|t1)/1.2);
return t;


推荐阅读
  • 【SharePoint】详解搜索服务Search Service的配置步骤(上篇)
    在 SharePoint 2013 中,若需启用搜索服务,首先应创建一个搜索服务实例,然后启动该服务。若直接尝试启动服务而未先创建实例,系统将显示错误提示。创建搜索服务的具体步骤包括:进入“应用程序管理”下的“管理服务应用程序”。此外,建议在创建实例前检查系统资源和权限设置,以确保服务的顺利运行。 ... [详细]
  • 本文初步探讨了PHP中基于JWT(JSON Web Token)的身份验证机制。具体流程包括:1. 客户端通过用户名和密码发起登录请求;2. 服务器接收并验证用户凭证的合法性,若验证通过,则生成并返回一个JWT令牌;3. 客户端接收该令牌,并在后续请求中携带此令牌以完成身份验证。这一机制不仅提高了安全性,还简化了会话管理。 ... [详细]
  • 利用命令行配置 ASP.NET Core 发布后的监听地址与环境变量设置
    通过命令行配置 ASP.NET Core 应用程序的发布设置,可以灵活地调整监听地址和环境变量。本文介绍如何在新建的 ASP.NET Core 项目中,通过修改 `Program.cs` 文件中的代码来实现这一功能。具体步骤包括在 `Program` 类的 `Main` 方法中添加相应的配置代码,以确保应用程序在不同环境中能够正确运行。此外,还将详细介绍如何使用命令行工具来设置和验证这些配置项,从而提高开发和部署的效率。 ... [详细]
  • 教程:使用Source Monitor进行代码质量分析
    Source Monitor 是一款强大的代码分析工具,能够对 Java、C++、C、C# 和 Delphi 等多种编程语言进行复杂度分析,帮助开发者有效评估和提升代码质量。通过详细的指标和报告,该工具可辅助团队识别潜在问题并优化代码结构。 ... [详细]
  • 本文深入探讨了Windows操作系统中线程同步机制的关键技术,重点分析了`WaitForSingleObject`和`Event`的使用方法及其应用场景。通过详细介绍`CreateEvent`函数的创建过程及其在判断线程退出和实现线程间同步中的重要作用,结合具体实例,展示了如何高效地利用这些工具来解决多线程编程中的常见问题。此外,文章还讨论了这些机制在实际开发中的最佳实践和注意事项,为开发者提供了宝贵的参考。 ... [详细]
  • PAT甲级 1068 寻找更多硬币 (30分) 01背包问题与路径优化
    PAT甲级 1068 寻找更多硬币 (30分) 01背包问题与路径优化 ... [详细]
  • 如何使用专业软件打开和编辑PHP电影文件?
    如何使用专业软件打开和编辑PHP电影文件? ... [详细]
  • Nginx入门指南:从零开始掌握基础配置与优化技巧
    Nginx入门指南:从零开始掌握基础配置与优化技巧 ... [详细]
  • 第一次写这玩意,不知道什么时候能写完,今天项目比较近,期望年底能看完吧。先定个小目标20201228完成第1章Spring介绍第2章入门第3章在Spring中引入IoC和DI第4章 ... [详细]
  • 软件开发史上最具影响力的十位编程大师(附图解)
    在软件开发领域,有十位编程大师对行业发展产生了深远影响。本文基于国外知名社区的一项评选,通过图文并茂的形式,详细介绍了这十位杰出人物,包括游戏开发先驱John Carmack等,为读者呈现了他们卓越的技术贡献与创新精神。 ... [详细]
  • 优化后的标题:WordPress 子菜单显示在主菜单项下方的布局调整方法
    在 WordPress 中,为了实现一个更加用户友好的导航菜单,我尝试了一种方法,使父级菜单项在全屏状态下始终可见,而当用户点击或悬停在父级菜单项上时,子菜单会以下拉形式展开,从而提供清晰且直观的导航体验。这种方法不仅提升了网站的可访问性,还增强了用户体验。 ... [详细]
  • 在 Linux 环境下,深入探讨 GTK+3.0 的高级开发技巧,涵盖组件定制、事件处理及多线程应用等核心内容,帮助开发者提升应用界面的交互性和性能。 ... [详细]
  • 在处理大文件上传时,服务端为何无法直接接收?这主要与 PHP 配置文件 `php.ini` 中的几个关键参数有关,如 `upload_max_filesize` 和 `post_max_size`。这些参数分别限制了单个文件的最大上传大小和整个 POST 请求的数据量。为了实现大文件的高效上传,可以通过文件分割与分片上传的方法来解决。本文将详细介绍这一实现方法,并提供相应的代码示例,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文详细探讨了Struts框架中几种常用的数据标签,包括`s:property`、`s:a`、`s:debug`、`s:include`和`s:param`。这些标签在实际开发中的应用广泛,不仅用于数据展示和链接生成,还提供了调试和模块化功能。文章分析了每个标签的基本用法及其属性配置,并结合具体示例介绍了如何进行性能优化和最佳实践。通过这些内容,开发者可以更好地理解和利用这些标签,提高开发效率和代码质量。 ... [详细]
  • 本文深入探讨了ASP.NET Web API与RESTful架构的设计与实现。ASP.NET Web API 是一个强大的框架,能够简化HTTP服务的开发,使其能够广泛支持各种客户端设备。通过详细分析其核心原理和最佳实践,本文为开发者提供了构建高效、可扩展且易于维护的Web服务的指导。此外,还讨论了如何利用RESTful原则优化API设计,确保系统的灵活性和互操作性。 ... [详细]
author-avatar
世界著名墙头草
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有